1 package org.votech.ds6.plastlets;
2
3 import java.awt.Container;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.awt.event.WindowAdapter;
7 import java.awt.event.WindowEvent;
8 import java.net.MalformedURLException;
9 import java.net.URL;
10 import java.util.Collection;
11
12 import javax.jnlp.ServiceManager;
13 import javax.jnlp.SingleInstanceListener;
14 import javax.jnlp.SingleInstanceService;
15 import javax.jnlp.UnavailableServiceException;
16 import javax.swing.AbstractButton;
17 import javax.swing.BoxLayout;
18 import javax.swing.ImageIcon;
19 import javax.swing.JFrame;
20 import javax.swing.JPanel;
21 import javax.swing.SwingUtilities;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.astrogrid.acr.ACRException;
26 import org.jdesktop.jdic.desktop.Desktop;
27 import org.votech.ds6.paf.PlasticPanel;
28 import org.votech.ds6.plastlets.PlastletsManager.PlastletChangeListener;
29 import org.votech.plastic.PlasticListener;
30 import org.votech.plastic.incoming.handlers.StandardHandler;
31 import org.votech.plastic.managers.AcrManager;
32 import org.votech.plastic.managers.PlasticManager;
33
34 /***
35 * Main entry point for registering and starting plastlets.
36 * @author jdt
37 *
38 */
39 public class Main extends JFrame implements PlastletChangeListener {
40 /***
41 *
42 */
43 private static final long serialVersionUID = 1L;
44
45 /***
46 * Logger for this class
47 */
48 private static final Log logger = LogFactory.getLog(Main.class);
49
50 public static final String BASEURL = "http://plastic.sourceforge.net/multiproject/plastlets";
51 public static final String LOGO = BASEURL+"/images/plastlets.gif";
52
53
54 public static final String IVORN = "ivo://blank";
55
56 public static final String NAME = "Standalone-Plastlets-Manager";
57
58 public static final String DESCRIPTION = "The Plastlets manager is responsible for (surprise, surprise) managing <a href='"+BASEURL+"'>Plastlets</a>. Plastlets are small Plastic applications. More soon...";
59
60 protected static final String HELP_URL = "http://plastic.sourceforge.net/multiproject/plastletweb/help.html";
61
62 private PlastletsManager plastletsManager;
63
64 public static void main(String[] args) throws ACRException {
65 JFrame frame = new Main();
66 frame.setVisible(true);
67
68 }
69
70 public Main() {
71 imageicon = new ImageIcon(this.getClass().getResource("plastlets.jpg"));
72
73 setDesktopIntegration();
74
75 logger.info("Initialising Plastic Manager");
76 StandardHandler handler = new StandardHandler(NAME, DESCRIPTION, IVORN, LOGO, PlasticListener.CURRENT_VERSION);
77 PlasticManager plasticManager = new PlasticManager(NAME,handler,false,10000);
78
79 logger.info("Initialising ACRManager");
80 AcrManager acrManager = new AcrManager(false, 10000,NAME);
81
82
83 plastletsManager = new PlastletsManager(acrManager, plasticManager);
84 plastletsManager.add(this);
85 plastletsManager.createAndRegisterAllPlastlets();
86 initGui();
87
88 logger.debug("Managers will connect when ready");
89 plasticManager.connectWhenReady();
90 acrManager.connect(false);
91 }
92
93 private void setDesktopIntegration() {
94 final VisibilityManager visibilityManager = new VisibilityManager(this, imageicon);
95
96 try {
97
98 SingleInstanceService sis = (SingleInstanceService)ServiceManager.lookup("javax.jnlp.SingleInstanceService");
99 sis.addSingleInstanceListener(new SingleInstanceListener() {
100
101 public void newActivation(String[] arg0) {
102 logger.info("User has attempted to start another instance - make ourselves visible");
103 visibilityManager.setVisible(true);
104 }
105
106 });
107
108 } catch(UnavailableServiceException ue) {
109 logger.info("SingleInstanceService not available - not running under webstart 5 or above");
110 return;
111 }
112 }
113
114 private void initGui() {
115 logger.debug("Initialising GUI");
116 addWindowListener(new WindowAdapter() {
117
118
119
120
121 @Override
122 public void windowClosing(WindowEvent arg0) {
123 super.windowClosing(arg0);
124 logger.info("Shutting down");
125 shutDown();
126 }
127
128 });
129 setTitle("Plastlets");
130
131 setIconImage(imageicon.getImage());
132 Container pane = getContentPane();
133 PlasticPanel plasticPanel;
134 if (CheckJDICPresent.desktop.check()) {
135
136 plasticPanel = new PlasticPanel(true,true,true,false);
137 plasticPanel.addHelpListener(new ActionListener() {
138
139 public void actionPerformed(ActionEvent arg0) {
140 try {
141 Desktop.browse(new URL(HELP_URL));
142 } catch (Exception e) {
143 logger.error("Couldn't open help page in browser ",e);
144 }
145
146 }
147
148 });
149 } else {
150 plasticPanel = new PlasticPanel(true,true,false,false);
151 }
152 pane.add(plasticPanel);
153 workingPane = new JPanel();
154 plasticPanel.add(workingPane);
155
156
157
158 PlasticManager plasticManager = plastletsManager.getPlasticManager();
159 AcrManager acrManager = plastletsManager.getAcrManager();
160 plasticManager.addObserver(plasticManager.new ObserverAdaptor(plasticPanel));
161 acrManager.addObserver(acrManager.new ObserverAdaptor(plasticPanel));
162
163
164 pack();
165 }
166
167 protected void shutDown() {
168 plastletsManager.shutDown();
169 System.exit(0);
170
171 }
172
173 public void plastletsChanged() {
174 refreshGUI();
175 }
176
177 private Container workingPane = new JPanel();
178
179 private ImageIcon imageicon;
180 private void refreshGUI() {
181 SwingUtilities.invokeLater(new Runnable() {
182 public void run() {
183 logger.debug("Refreshing GUI");
184 workingPane.removeAll();
185 workingPane.setLayout(new BoxLayout(workingPane, BoxLayout.PAGE_AXIS));
186 Collection<Plastlet> plastlets = plastletsManager.getPlastlets();
187 for (final Plastlet plastlet: plastlets) {
188 PlastletMetaData meta = plastlet.getMetaData();
189 String name = meta.getName();
190 String desc = meta.getDescription();
191 String logo = meta.getLogoUrl();
192 URL logoUrl = null;
193 try {
194 logoUrl = new URL(logo);
195 } catch (MalformedURLException e) {
196 logger.warn("Couldn't get logo from "+logo,e);
197
198 }
199
200 final AbstractButton button = new JOnOffButton(name);
201 if (logoUrl!=null) {
202 button.setIcon(new ImageIcon(logoUrl));
203 }
204
205 button.setToolTipText(desc);
206 logger.debug("Adding button for "+name);
207 workingPane.add(button);
208 button.addActionListener(new ActionListener() {
209
210 public void actionPerformed(ActionEvent arg0) {
211 plastletsManager.enablePlastlet(plastlet, button.isSelected());
212 }
213
214 });
215
216 }
217 workingPane.validate();
218 pack();
219 }});
220 }
221
222 }